#include <vector>
#include <queue>
#include "sched_fcfs.h"
#include <iostream>

using namespace std;

SchedFCFS::SchedFCFS(vector<int> argn) {
    // FCFS recibe la cantidad de cores.
    cout << "cores:" << argn[0] << endl;
    // Tenemos una cola para cada core, no hay migracion de tareas
    for(int i=0; i< argn[0]; i++){
        queue<int> fifo;
        tareas.push_back(fifo);
    }
}

SchedFCFS::~SchedFCFS() {
}

//Elige el procesador mas "libre" al momento de llegada de una nueva tarea
int SchedFCFS::minCpu(){
    unsigned int min = tareas[0].size();
    int indiceMin = 0; 
        for(unsigned int i=0;i<tareas.size(); i++){
            if(tareas[i].size() < min || (min == tareas[i].size() &&current_pid(i)==IDLE_TASK) ){
                min = tareas[i].size();
                indiceMin=i;
            }
        }
    cout << "indiceMin:" << indiceMin << endl;
    return indiceMin;
}

void SchedFCFS::load(int pid) {
    int min = minCpu();
    tareas[min].push(pid);  
}

void SchedFCFS::unblock(int pid) {
}

int SchedFCFS::tick(int cpu, const enum Motivo m) {
    int actual = current_pid(cpu);
    if(current_pid(cpu)==IDLE_TASK || m==EXIT){
        if(tareas[cpu].empty()){
            return IDLE_TASK;
        } else{ 
            actual = tareas[cpu].front();
            tareas[cpu].pop();
            return actual;
        }
    }else{
        return current_pid(cpu);
    }   
}
